package Fisica;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

import Hibernate.Cliente;

public abstract class ClienteFisica {

	
	//Busca un Cliente a partir de un identificador OK
    public static Cliente findById(Integer id) {
  	try {
	    	Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();
	        session.beginTransaction();
	                
	        Query query = session
	        .createQuery("from Cliente as a where a.idcliente = '"+id+"'");
	        List<Cliente> list = query.list();
	        
	        session.getTransaction().commit(); //Como ya se ha hecho la consulta, hago commit. 
	        								   //El commit cierra automnticamente la session.
	        SessionFactoryUtil.getSessionFactory().close();
	
	        if (list.isEmpty()) 
	        	{	System.out.println("No se encontro el Cliente");
	        		return new Cliente();
	        	}
	        else {	System.out.println("Se encontro el Cliente!!!");
	        		return list.get(0);
	        	}
	       }catch (RuntimeException re) {
				System.out.println("get failed: "+re);
				throw re;
			}
   }
    
  //Busca un cliente a partir de un objeto Cliente OK
	public static Cliente find(Cliente c) {
		return ClienteFisica.findById(c.getIdcliente());
    }
    
  //Busca un Cliente a partir de un identificador OK
    public static Cliente findByNombreYAp(String nom, String ap) {
    	try {
	    	Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();
	        session.beginTransaction();
	                
	        Query query = session
	        .createQuery("from Cliente as c where c.apellido = '"+ap+"' and c.nombre = '"+nom+"'");
	        List<Cliente> list = query.list();
	        
	        session.getTransaction().commit(); 
	        SessionFactoryUtil.getSessionFactory().close();
	
	        if (list.isEmpty()) 
	        	{	System.out.println("No se encontro el Nombre y apellido");
	        		return new Cliente();
	        	}
	        else {	System.out.println("Se encontro el Nombre y apellido!!!");
	        		return list.get(0);
	        	}
	       }catch (RuntimeException re) {
				System.out.println("get failed: "+re);
				throw re;
			}
   }
    
  //Busca un Cliente a partir de un identificador OK
    public static List<Cliente> list() {
    	try {
	    	Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();
		    session.beginTransaction();
		                
		    Query query = session
		     .createQuery("from Cliente as o order by o.idcliente asc");
		    List<Cliente> list = query.list();
		        
		    session.getTransaction().commit(); //Como ya se ha hecho la consulta, hago commit. 
		        								   //El commit cierra automnticamente la session.
		    SessionFactoryUtil.getSessionFactory().close();
		
		    return list;	 
    	}catch (RuntimeException re) {
			System.out.println("get failed: "+re);
			throw re;
		}
   }
    
  //Agrego un cliente a la base OK
	public static void add(Cliente c) {
		try{
			Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();
	        session.beginTransaction();
	        
	        //chekeo que el cliente no exista para agregarlo
	        Query query = session
	        .createQuery("from Cliente as c " +
	        		"where c.nombre like '%"+c.getNombre()+"%' " +
	        			"and c.apellido like '%"+c.getApellido()+"%'");
	        List<ClienteFisica> list = query.list();
	
	        if (list.isEmpty())
	        {
	        	session.save(c);
	        	System.out.println("Cliente agregado con exito!!!");
	        }
	        
	        session.getTransaction().commit(); //Como ya se ha hecho la consulta, hago commit. 
	        								   //El commit cierra automnticamente la session.
	        SessionFactoryUtil.getSessionFactory().close();
		}catch (RuntimeException re) {
				System.out.println("get failed: "+re);
				throw re;
			}
	}
	
	//Actualizacion de un Cliente OK
	public static void update(Cliente c) {
		try{
	        Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();
	        session.beginTransaction();
	        
	        //chekeo que el cliente no exista para agregarlo 
	        System.out.println("chekeo que el cliente no exista para agregarlo ");
	        if (c.getIdcliente() != 0) {
	        	session.saveOrUpdate(c);
	            System.out.println("Cliente actualizado con exito!!!");
	        }
	               
	        session.getTransaction().commit(); //Como ya se ha hecho la consulta, hago commit. El commit cierra automnticamente la session.
	        SessionFactoryUtil.getSessionFactory().close();
		}catch (RuntimeException re) {
				System.out.println("get failed: "+re);
				throw re;
			}
    }
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
//		ClienteFisica ch;		
//		int x = 1;
//		String s = "Luciano";
////		Cliente c = ch.findById(x);
//		Cliente c = ClienteFisica.findByNombre(s);
//		Cliente c = ClienteFisica.findById(x);
//		c.setIdcliente(1);
//		System.out.println("c.getApellido(): "+c.getApellido() );
//		System.out.println("c.getNombre(): "+c.getNombre() );
//		System.out.println("c.getDireccion(): "+c.getDireccion() );
//		System.out.println("c.getTelefono(): "+c.getTelefono() );
//		System.out.println("c.getEmail(): "+c.getEmail() );
//		System.out.println("c.getIdcliente(): "+c.getIdcliente() );
//		System.out.println("c.getIdcliente() == 0: "+(c.getIdcliente() == 0) );
		
//		List<Cliente> l = ClienteFisica.list();
//		System.out.println("ID  |    APELLIDO   |  NOMBRE  |   DIRECCION  |   TELEFONO   |  EMAIL");
//		for (Cliente cl : l) {
//			System.out.print(cl.getIdcliente() );
//			System.out.print(" | ");
//			System.out.print(cl.getApellido() );
//			System.out.print(" | ");
//			System.out.print(cl.getNombre());
//			System.out.print(" | ");
//			System.out.print(cl.getDireccion() );
//			System.out.print(" | ");
//			System.out.print(cl.getTelefono() );
//			System.out.print(" | ");
//			System.out.println(cl.getEmail() );		
//		} 
		
//		Cliente cu = new Cliente();
//		cu.setIdcliente(6);
//		cu.setApellido("apellidoV");
//		cu.setNombre("nombreV");
//		cu.setDireccion("calleV 333");
//		cu.setTelefono("33648");
//		cu.setEmail("viejo@mail.com");
//		
//		
//		ClienteFisica.update(cu);
		

	}

}
